/**
 * 请求模块
 */
import axios from 'axios'
import store from '@/store'
import router from '../router'
import jsonBig from 'json-bigint'
import VueRouter from 'vue-router'

// 创建axios实例对象
const requestApi = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/', // 接口的基准路径
  // transformResponse 允许自定义原始的响应数据（字符串）
  transformResponse: [function (data) {
    try {
      // 如果转换成功则返回转换的数据结果
      return jsonBig.parse(data)
    } catch (err) {
      // 如果转换失败，则包装为统一数据格式并返回
      return {
        data
      }
    }
  }]
})

// 添加请求拦截器   在axios实例对象创建
requestApi.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // config：本次的请求的配置对象

  // 目的:将每次的请求配置一个tokren令牌-==--登录的页面请求除外
  // 1.获取token值===解构出vuex中userToken
  const { userToken } = store.state.login
  // 2.判断toekn是否存在
  if (userToken && userToken.token) {
    // 3.添加header请求头   Bearer后必须有且只有一个空格
    config.headers.Authorization = `Bearer ${userToken.token}`

    
    // console.log('刷新后重新请求的：',userToken.token)
  }
  return config;//必须存在。用来返回数据。以终止拦截
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
requestApi.interceptors.response.use(function (response) {
  // 对响应数据做点什么

  return response;
}, function (error) {

  // 这里是请求失败的回调函数-- 我们是在这里进行 token刷新的操作
  // console.log('这里是请求失败的回调函数', error.response)


  const { userToken } = store.state.login
  // 首先错误必须是401才有刷新token的需求
  if (error.response && error.response.status == 401) {
    if (!userToken || !userToken.refresh_token) {
      return router.push('/login')
    }

    // 只有当用有refresh_toekn的时候，才能发起请求
    try {
      axios({
        url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
        method: 'PUT',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          Authorization: `Bearer ${userToken.refresh_token}`
        }
      }).then((res) => {
        store.commit('setUserToken', {
          token: res.data.data.token,
          refresh_token: userToken.refresh_token
        })
        window.location.reload()//重新刷新
        // return requestApi(error.config)
      })
    } catch (err) {

    console.log('ohh');
    
      router.push('/login')
    }
  }

  return Promise.reject(error);




  // // 对响应错误做点什么
  // if (error.response && error.response.status == 401) {
  //   // 如果有错误，并且错误为401时
  //   // 1.判断是否有token，有则进入刷新token
  //   const { userToken } = store.state.login

  //   console.log(userToken,100);

  //   if (userToken && userToken.refresh_token) {
  //     axios({
  //       url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
  //       method: 'PUT',
  //       headers: {
  //         "Content-Type": "application/x-www-form-urlencoded",
  //         Authorization: `Bearer ${userToken.refresh_token}`
  //       }
  //     }).then(res => {
  //       console.log(res);
  //       // 将本地的token更新
  //       store.commit("setUserToken", {
  //         token: res.data.data.token,
  //         refresh_token: userToken.refresh_token
  //       })

  //       return request(error.config)
  //     }).catch(err => {
  //       console.log('失败，请重试！');
  //       router.push('/login')
  //     })
  //   } else {
  //     // 2.没有则，进入登录页面
  //     console.log('meiyou ');
  //     router.push('/login')
  //   }
  // }
  
});


// 导出实例对象
export default requestApi
